package models_sports

const (
	CategorySport  = iota + 1 // 体育
	CategoryESport            // 电竞
)

const (
	SportFootball   = iota + 1 // 足球
	SportBasketball            // 篮球
)

var (
	// SportNameMap 类型名称
	SportNameMap = map[int]string{
		1:   "足球",
		2:   "篮球",
		3:   "网球",
		5:   "板球",
		6:   "棒球",
		7:   "手球",
		8:   "冰球",
		10:  "排球",
		11:  "乒乓球",
		16:  "曲棍球",
		17:  "美式橄榄球",
		19:  "斯洛克",
		22:  "水球",
		24:  "羽毛球",
		101: "LOL",
		102: "CS: GO",
		103: "DOTA2",
		106: "KOG",
	}
	// SportType 体育类型
	SportType = []int{
		1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 16, 17, 19, 22, 24,
	}
	// ESportType 电竞类型
	ESportType = []int{
		101, 102, 103, 106,
	}
	// ESportStatus 电竞中所有状态都统一
	ESportStatus = map[int]string{
		0:  "比赛异常", // 说明：暂未判断具体原因的异常比赛，建议隐藏处理
		1:  "未开赛",
		2:  "进行中",
		3:  "完场",
		11: "中断",
		12: "取消",
		13: "延期",
		14: "腰斩",
		15: "待定",
	}
	// FootBallStatus 蓝球状态
	FootBallStatus = map[int]string{
		0:  "比赛异常", // 说明：暂未判断具体原因的异常比赛，可能但不限于：腰斩、取消等等，建议隐藏处理"
		1:  "未开赛",
		2:  "上半场",
		3:  "中场",
		4:  "下半场",
		5:  "加时赛",
		6:  "加时赛(弃用)",
		7:  "点球决战",
		8:  "完场",
		9:  "推迟",
		10: "中断",
		11: "腰斩",
		12: "取消",
		13: "待定",
	}
	// BasketBallStatus 蓝球状态
	BasketBallStatus = map[int]string{
		0:  "比赛异常",
		1:  "未开赛",
		2:  "第一节",
		3:  "第一节完",
		4:  "第二节",
		5:  "第二节完",
		6:  "第三节",
		7:  "第三节完",
		8:  "第四节",
		9:  "加时",
		10: "完场",
		11: "中断",
		12: "取消",
		13: "延期",
		14: "腰斩",
		15: "待定",
	}
)

// MatchLives 直播链接
type MatchLives struct {
	MatchID             int    `json:"match_id" gorm:"primaryKey; comment:比赛id"`
	MatchTime           int    `json:"match_time" gorm:"type:int(11);comment:比赛时间"`
	MatchStatus         int    `json:"match_status" gorm:"type:int(11);comment:比赛状态"`
	StandardMatchStatus int    `json:"standard_match_status" gorm:"type:int(11);comment:标准化比赛状态"`
	Category            int    `json:"type" gorm:"type:int(11);comment:类型 1 体育 2 电竞"`
	SportID             int    `json:"sport_id" gorm:"type:int(11);comment:类型ID"`
	SportName           string `json:"sport_name" gorm:"type:varchar(255);comment:类型名称"`
	Comp                string `json:"comp" gorm:"type:varchar(255);comment:赛事"`
	Home                string `json:"home" gorm:"type:varchar(255);comment:主队"`
	Away                string `json:"away" gorm:"type:varchar(255);comment:客队"`
	UHDLink             string `json:"uhd_link" gorm:"type:varchar(255);comment: 超清直播地址，没有为空"`
	HDLink              string `json:"hd_link" gorm:"type:varchar(255);comment: 高清直播地址，没有为空"`
	SDLink              string `json:"sd_link" gorm:"type:varchar(255);comment: 标清直播地址，没有为空"`
	PCLink              string `json:"pc_link" gorm:"type:varchar(255);comment: h5 m3u8超清直播地址"`
	Stream              string `json:"stream" gorm:"type:varchar(255);comment:流名"`
}

type TextLiveStruct struct {
	Id         int    `json:"match_id"`    // 赛事id
	Time       string `json:"time"`        // 事件时间
	Type       int8   `json:"type"`        // 事件类型
	Data       string `json:"data"`        // 事件文本
	Position   int8   `json:"position"`    // 事件發生方， 0-中立 1-主队 2-客队
	Main       int8   `json:"main"`        // 是否重要事件 0-否 1-是
	AwayScore  int    `json:"away_score"`  // 客队比分
	HomeScore  int    `json:"home_score"`  // 主队比分
	CreateTime int64  `json:"create_time"` // 創建時間
}

// IsDone 判断比赛是否完结
func (m MatchLives) IsDone() bool {
	// 电竞类型的因为状态统一,就判断是否大于完场的数据即可
	switch m.Category {
	case CategoryESport:
		if m.MatchStatus >= 3 {
			return true
		}
	case CategorySport:
		return m.getSportIsDone()
	}
	// 为0的异常数据也丢弃，不要了
	if m.MatchStatus == 0 {
		return true
	}
	return false
}

// 获取体育赛事是否完赛
func (m MatchLives) getSportIsDone() bool {
	switch m.SportID {
	case SportBasketball:
		if m.MatchStatus >= 10 {
			return true
		}
	case SportFootball:
		if m.MatchStatus >= 8 {
			return true
		}
	}
	return false
}

func containsId(elems []int, elem int) bool {
	for _, e := range elems {
		if elem == e {
			return true
		}
	}
	return false
}

func GetCategory(sportId int) (cate int) {
	if containsId(SportType, sportId) {
		cate = CategorySport
	} else {
		cate = CategoryESport
	}
	return cate
}

func GetSportName(sportId int) string {
	sportName, ok := SportNameMap[sportId]
	if !ok {
		return "未知的类型"
	}
	return sportName
}
